API:teleport
Props:
to
-string
。需要 prop,必须是有效的查询选择器或 HTMLElement (如果在浏览器环境中使用)。指定将在其中移动<teleport>
内容的目标元素
1 | <!-- 正确 --> |
disabled
-boolean
。此可选属性可用于禁用<teleport>
的功能,这意味着其插槽内容将不会移动到任何位置,而是在您在周围父组件中指定了<teleport>
的位置渲染。
1 | <teleport to="#popup" :disabled="displayVideoInline"> |
请注意,这将移动实际的 DOM 节点,而不是被销毁和重新创建,并且它还将保持任何组件实例的活动状态。所有有状态的 HTML 元素 (即播放的视频) 都将保持其状态。
示例
一个常见的场景是创建一个包含全屏模式的组件。在大多数情况下,你希望模态框的逻辑存在于组件中,但是模态框的定位很快就很难通过 CSS 来解决,或者需要更改组件组合。以下代码,modal
将渲染在 teloport-child
子组件里面。
1 | <template> |
Teleport 提供了一种干净的方法,允许我们控制在 DOM 中哪个父节点下呈现 HTML,而不必求助于全局状态或将其拆分为两个组件。
让我们修改 modal-button
以使用 <teleport>
,并告诉 Vue “Teleport 这个 HTML 到该‘body’标签”。因此,一旦我们单击按钮打开模态框,Vue 将正确地将模态框内容渲染为 body
标签的子级。
1 | <template> |
与 Vue components 一起使用
如果 <teleport>
包含 Vue 组件,则它仍将是 <teleport>
父组件的逻辑子组件:
1 | const app = Vue.createApp({ |
在这种情况下,即使在不同的地方渲染 child-component
,它仍将是 parent-component
的子级,并将从中接收 name
prop。
这也意味着来自父组件的注入按预期工作,并且子组件将嵌套在 Vue Devtools 中的父组件之下,而不是放在实际内容移动到的位置。
在同一目标上使用多个 teleport
一个常见的用例场景是一个可重用的 <Modal>
组件,它可能同时有多个实例处于活动状态。对于这种情况,多个 <teleport>
组件可以将其内容挂载到同一个目标元素。顺序将是一个简单的追加——稍后挂载将位于目标元素中较早的挂载之后。
1 | <teleport to="#modals"> |